package cn.itcast.bos.web.action.base;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import javax.lang.model.element.Parameterizable;

import org.springframework.data.domain.Page;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 代码重构  优化
 * 实现功能:
 * 1.抽取模型驱动  :涉及参数化 泛型  实例化问题  (很重要)
 * 因为抽取出来的参数具体类型未知,不能实例化,那么就产生了  参数化泛型  实例化问题
 * 解决措施:通过 构造方法   this:谁调用就代表谁  
 * 子类创建对象,就会调用父类的构造方法,那么父类构造方法中的this就指调用的子类,然后通过以下步骤解决:
 * 		1.获得 带参的父类类型
 * 		2.获得所有参数类型
 * 		3根据参数类型来实例化
 * 
 * abstract 表名该类是抽象类,那么就方法就不需要写具体功能了
 * 
 * 2.分页查询代码重构优化
 * 即:将返回数据
 * @author 35368
 *
 */

public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
	//模型驱动      protected表示在其他包的子类可以调用  
	protected T model;   
	@Override
	public T getModel() {
		return model;
	}
	//构造器   完成 model的实例化
	public BaseAction(){
		//1.通过子类action对象,获取带参的父类
		Type genericSuperclass = this.getClass().getGenericSuperclass();
		ParameterizedType parameterizedType = (ParameterizedType)genericSuperclass;
		//2.获得父类的   参数化泛型的类   
		Class<T> modelclass = (Class<T>) parameterizedType.getActualTypeArguments()[0];
		//3.实例化 参数化泛型类
		try {
			 model = modelclass.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("模型构造失败.....");
		}
	}
	//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&  分页查询 代码优化
	//接收分页查询参数     属性驱动
	protected int page;
	protected int rows;
	public void setPage(int page) {
		this.page = page;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}
	//将分页查询结果数据,压入值栈的方法
	protected void pushPageDataToValueStack(Page<T> pageData){
		//创建一个map集合  构造指定格式的json  
		Map<String,Object> map = new HashMap<String ,Object>();
		map.put("total", pageData.getTotalElements());
		map.put("rows", pageData.getContent());
		ActionContext.getContext().getValueStack().push(map);
	}

}
